package com.mmaingenieria.MMAGestor.beans;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;

import org.apache.log4j.Logger;

import com.mmaingenieria.MMAGestor.enumerations.EstadoUsuario;
import com.mmaingenieria.MMAGestor.enumerations.RolUsuario;
import com.mmaingenieria.MMAGestor.model.ModeloUsuario;

public class Usuario {
	// Atributos Miembro 
    //*************************************************************************
    private int id;
    private String usuario;
    private String password;
    
    
    private String nombre;
    private String apellido1;
    private String apellido2;
    private String nif;
    private String email;
    
    private RolUsuario rol;
    private EstadoUsuario estado;
    private int	clienteId;
    private String observaciones;
    private int createdBy;
    private Timestamp dateCreated;
    private int modifiedBy;
    private Timestamp lastUpdate;

    //Constructores
    //*************************************************************************
    //constructor vacio
    public Usuario() {
		super();
	}
    //contructor completo
    public Usuario(int id, String usuario, String password, String nombre,
			String apellido1, String apellido2, String nif, String email,
			RolUsuario rol, EstadoUsuario estado, int clienteId, String observaciones, int createdBy, Timestamp dateCreated, int modifiedBy, Timestamp updateLast) {
		super();
		this.id = id;
		this.usuario = usuario;
		this.password = password;
		this.nombre = nombre;
		this.apellido1 = apellido1;
		this.apellido2 = apellido2;
		this.nif = nif;
		this.email = email;
		this.rol = rol;
		this.estado = estado;
		this.clienteId = clienteId;
		this.observaciones= observaciones;
		this.createdBy = createdBy;
		this.dateCreated = dateCreated;
		this.modifiedBy =modifiedBy;
		this.lastUpdate = updateLast;
	}
    //constructor para base de datos
	public Usuario(String usuario, String password, String nombre,
			String apellido1, String apellido2, String nif, String email,
			RolUsuario rol, EstadoUsuario estado,int clienteId, String observaciones, int createdBy, Timestamp dateCreated, int modifiedBy) {
		super();
		this.usuario = usuario;
		this.password = password;
		this.nombre = nombre;
		this.apellido1 = apellido1;
		this.apellido2 = apellido2;
		this.nif = nif;
		this.email = email;
		this.rol = rol;
		this.estado = estado;
		this.clienteId = clienteId;
		this.observaciones= observaciones;
		this.createdBy = createdBy;
		this.dateCreated = dateCreated;
		this.modifiedBy =modifiedBy;
	}
	    
    //Getters y Setters
    //*************************************************************************
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsuario() {
		return usuario;
	}
	public String getObservaciones() {
		return observaciones;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getApellido1() {
		return apellido1;
	}
	public void setApellido1(String apellido1) {
		this.apellido1 = apellido1;
	}
	public String getApellido2() {
		return apellido2;
	}
	public void setApellido2(String apellido2) {
		this.apellido2 = apellido2;
	}
	public String getNif() {
		return nif;
	}
	public void setNif(String nif) {
		this.nif = nif;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public RolUsuario getRol() {
		return rol;
	}
	public RolUsuario getRol(int idRol) { //TODO falta meter excepcion
		switch (idRol){
		case 1:
			return RolUsuario.Administrador; 
		case 2:
			return RolUsuario.Editor;
		case 3:
			return RolUsuario.Cliente;
		case 4:
			return RolUsuario.Consultor;
		default:
			return RolUsuario.Consultor;
		}
	}
	public void setRol(RolUsuario rol) {
		this.rol = rol;
	}
	public void setRol(int idRol) {//TODO falta meter excepcion
		switch (idRol){
		case 1:
			this.rol=RolUsuario.Administrador;
			break;
		case 2:
			this.rol=RolUsuario.Editor;
			break;
		case 3:
			this.rol=RolUsuario.Cliente;
			break;
		case 4:
			this.rol=RolUsuario.Consultor;
			break;
		}
	}
	public EstadoUsuario getEstado() {
		return estado;
	}
	public EstadoUsuario getEstado(int idEstado) { //TODO falta meter excepcion
		switch (idEstado){
		case 1:
			return EstadoUsuario.Activo; 
		case 2:
			return EstadoUsuario.Inactivo;
		default:
			return EstadoUsuario.Inactivo;
		}
	}
	public void setEstado(EstadoUsuario estado) {
		this.estado = estado;
	}
	public void setEstado(int idEstado) {//TODO falta meter excepcion
		switch (idEstado){
		case 1:
			this.estado=EstadoUsuario.Activo;
			break;
		case 2:
			this.estado=EstadoUsuario.Inactivo;
			break;
		}
	}
	public int getClienteId() {
		return this.clienteId;
	}
	public void setClienteId(int clienteId) {
		this.clienteId = clienteId;
	}
	public void setObservaciones(String observaciones) {
		this.observaciones = observaciones;
	}
	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}
	public int getCreatedBy() {
		return createdBy;
	}
	public void setCreatedBy(int createdBy) {
		this.createdBy = createdBy;
	}
	public Timestamp getDateCreated() {
		return dateCreated;
	}
	public void setDateCreated(Timestamp dateCreated) {
		this.dateCreated = dateCreated;
	}
	public int getModifiedBy() {
		return modifiedBy;
	}
	public void setModifiedBy(int modifiedBy) {
		this.modifiedBy = modifiedBy;
	}
	public Timestamp getLastUpdate() {
		return lastUpdate;
	}
	public void setLastUpdate(Timestamp LastUpdate) {
		this.lastUpdate = LastUpdate;
	}
	
	//Metodos
	//****************************************************************************************
	//Metodo que pasa el tipo fecha de la base de datos a formato legible dd/MM/aaaa
	public String getStringDateCreated(){
		SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy HH:mm");
    	String fechaCreacion = formatoFecha.format(this.dateCreated);
    	return fechaCreacion;
	}
	//Metodo que pasa el tipo timestamp de la base de datos a formato legible dd/MM/aaaa HH:mm
	public String getStringLastUpdate(){
		SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy HH:mm");
    	String fechaModificacion = formatoFecha.format(this.lastUpdate);
    	return fechaModificacion;
	}
	//Metodo que devuelve el tipo de rol pero en entero
	public int getNumeroRol(){ //TODO Falta meter excepcion	
		switch (this.rol){
			case Administrador:
				return 1;
			case Editor:
				return 2;
			case Cliente:
				return 3;
			case Consultor:
				return 4;
			default:
				return 4;
		}	
	}
	//Metodo que devuelve el tipo de esatdo pero en entero
	public int getNumeroEstado(){ //TODO Falta meter excepcion		
		switch (this.estado){
			case Activo:
				return 1;
			case Inactivo:
				return 2;
			default:
				return 2;
		}	
	}
	//Metodo que devuelve el nombre de usuario que ha creado al usuario
	public String getStringCreatedBy(){
		String nombre=null;
		try{
			if (this.createdBy == 0){//si el id es cero es porque es el primer usuario Admin creado desde base de datos
				nombre="Sistema";
			}
			else{//sino esque ha sido creado por un usuario normal del sistema
				ModeloUsuario modeloUsuario = new ModeloUsuario();//me creo un modelousuario
				Usuario user= modeloUsuario.obtenerUsuario(this.createdBy);//cojo el usuario del id que lo ha creado
				nombre=user.getNombre();// y devuelvo el nombre de dicho usuario
			}
		}catch(Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada obtener el string de CreatedBy");
		}
		return nombre;
	}
	
	//Metodo que devuelve el nombre de usuario que ha modificado al usuario
		public String getStringModifiedBy(){
			String nombre=null;
			try{
				ModeloUsuario modeloUsuario = new ModeloUsuario();//me creo un modelousuario
				Usuario user= modeloUsuario.obtenerUsuario(this.modifiedBy);//cojo el usuario del id que lo ha creado
				nombre=user.getNombre();// y devuelvo el nombre de dicho usuario
			}catch(Exception e){
				Logger.getLogger(this.getClass()).error("Excepcion generada obtener el string de ModifiedBy");
			}
			return nombre;
		}
	public void pintarUsuario(){//Saca por pantalla la info del usuario
		System.out.println(this.getId());
        System.out.println(this.getUsuario());
        System.out.println(this.getPassword());
        System.out.println(this.getNombre());
        System.out.println(this.getApellido1());
        System.out.println(this.getApellido2());
        System.out.println(this.getNif());
        System.out.println(this.getEmail());
        System.out.println(this.getRol());
        System.out.println(this.getEstado());
        System.out.println(this.getClienteId());
        System.out.println(this.getObservaciones());
        System.out.println(this.getCreatedBy());
        System.out.println(this.getDateCreated());
        System.out.println(this.getModifiedBy());
        System.out.println(this.getLastUpdate());
	}
	
	

}
